package com.cykj.user.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @BelongsProject: smart_recruit_backend
 * @BelongsPackage: com.cykj.user.util
 * @Author: 张昌煜
 * @CreateTime: 2025-08-25 14:32
 * @Description: TODO
 * @Version: 1.0
 */
public class LatLngDistanceUtil {
    // 地球平均半径（单位：米）
    private static final double EARTH_RADIUS = 6371000;

    /**
     * 计算两个经纬度之间的直线距离（大圆距离）
     * @param lat1 点A纬度（度）
     * @param lon1 点A经度（度）
     * @param lat2 点B纬度（度）
     * @param lon2 点B经度（度）
     * @return 距离（单位：米，保留2位小数）
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        // 1. 将经纬度从“度”转换为“弧度”
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);

        // 2. 计算纬度差、经度差
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLon = lon2Rad - lon1Rad;

        // 3. Haversine公式核心计算
        double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2)
                + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);

        // 4. 计算圆心角（atan2返回弧度值，范围[-π, π]，Math.sqrt(1-a)确保结果为正）
        double centralAngle = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 5. 计算距离（弧长 = 半径 × 圆心角）
        double distance = EARTH_RADIUS * centralAngle;

        // 6. 保留2位小数（避免浮点精度问题）
        return new BigDecimal(distance)
                .setScale(2, RoundingMode.HALF_UP)
                .doubleValue();
    }
}
